package com.ftf.tp.blog.domain.article.repository;

import com.ftf.tp.blog.domain.article.aggregate.ArticleAgg;
import com.ftf.tp.blog.domain.article.dos.*;
import com.ftf.tp.blog.domain.configuration.dos.ColumnDO;
import com.ftf.tp.blog.domain.configuration.dos.TagDO;

import java.util.List;
import java.util.Map;

/**
 * 文章信息 ES仓储
 *
 * @author tanghao
 * @date 2021/12/6
 */
public interface ArticleRepository {

    /**
     * @param articleId 文章id
     */
    ArticleDO byId(Long articleId);

    /**
     * 文章发布-保存
     *
     * @param articleAgg 文章聚合根
     */
    void initialSave(ArticleAgg articleAgg);

    /**
     * 获取批量文章主体信息
     *
     * @param idList id列表
     * @return 批量文章主体信息
     */
    List<ArticleIndexDO> queryArticleMainInfo(List<Long> idList);

    /**
     * 批量文章入ES-爬虫用
     *
     * @param articleEsDOList 文章es实体List
     */
    void insertEsArticleBatch(List<ArticleEsDO> articleEsDOList);

    /**
     * 新增文章 -同步es数据
     * 除了文章内容其他数据已经通过canal同步过去了
     *
     * @param articleAgg 文章实体
     */
    void syncEsArticle(ArticleAgg articleAgg);

    Map<String, Object> getBlogSupportSumList(List<String> keyList);

    Long getSupportByArticleId(Long articleId);

    Long getHotValueByArticleId(Long articleId);

    Long getLookByArticleId(Long articleId);

    ArticleConfigureDO getArticleConfigureById(Long articleId);

    void browseBlog(String sumKey, Long blogId);

    /**
     * 文章点赞数+1
     *
     * @param sumKey   key
     * @param targetId 文章id
     */
    void articleSupportSum(String sumKey, Long targetId);

    void commentBlog(String sumKey, Long targetId);

    Long getSupportCount(Long targetId);

    /**
     * 从es获取文章信息
     *
     * @param articleId 文章id
     */
    ArticleInfoDO getArticleInfoById(Long articleId);

    /**
     * 随机获取id列表
     */
    List<Long> getIdListRand();

    void articleTagAdd(Long id, List<TagDO> tagDOList);

    void articleColumnAdd(ArticleDO articleDO, List<ColumnDO> columnDOList);

    /**
     * 是否点过赞
     *
     * @param userId    用户id
     * @param articleId 文章id
     */
    Boolean isSupport(Long userId, Long articleId);

    /**
     * 点赞
     *
     * @param supportDO 点赞实体
     */
    void support(SupportDO supportDO);

    /**
     * 取消点赞
     *
     * @param userId   用户id
     * @param targetId 文章id
     */
    void cancelSupport(Long userId, Long targetId);

    /**
     * 写入浏览记录
     */
    void browseRecordWrite();

    /**
     * 更新热榜
     */
    void hotRank();

    void climbBlog(String userName, Long userId, String authorName, Long bigTag);

    void createIndex() throws Exception;

    void get();

    /**
     * 热榜信息
     *
     * @param idList 热榜id
     * @return 热榜信息
     */
    List<ArticleIndexDO> hotRankInfo(List<Long> idList);
}
